package spese.gestore.androidiani;

//import spese.gestore.androidiani.Presa_Dati;
import java.util.ArrayList;

import spese.gestore.androidiani.SpeseDb.SpeseMetaData;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.TextView;

/**
 * Questa classe permette all'utente di interfacciarsi ad una lista delle spese
 * effettuate da lui
 * 
 * @author Fusinato Lorenzo - Androidiani
 * 
 */
public class Lista_Spese extends Activity {

	ListView SpeseLv;
	public Cursor c;
	public SpeseDb db;
	public MissioniDb mdb;
	public String missione;
	protected String titolo_miss = "";
	protected String titolo_place = "";

	protected void onCreate(Bundle b) {
		super.onCreate(b);

		Intent intent = getIntent();
		// ottengo i dati proveninienti dall'activity chiamante

		missione = intent.getStringExtra("riga missione");
		System.out.println("id ricevuto da lista spese= " + missione);

		setContentView(R.layout.layout_lista_spese);

		db = new SpeseDb(getApplicationContext());
		mdb = new MissioniDb(getApplicationContext());

		db.open();
		mdb.open();

		final Button button_nuova_spesa = (Button) findViewById(R.id.button_nuova_spesa);
		final TextView tV_header = (TextView) findViewById(R.id.tV_lista_spese);

		titolo_miss = mdb.getRecord(missione, 1);
		titolo_place = mdb.getRecord(missione, 2);

		System.out.println(titolo_miss + " - " + titolo_place);

		tV_header.setText(titolo_miss + " - " + titolo_place);

		// Associo alla list view il suo id nel layout
		SpeseLv = (ListView) findViewById(R.id.lV_spese);

		// Il register serve per far si che se premo sulla List View capisce che
		// deve fare qualcosa
		registerForContextMenu(SpeseLv);

		// Chiamo la Query che in questo caso è un all
		c = db.SPESEbyMissione(missione);

		// Comincio a fare il management del cursore
		startManagingCursor(c);

		// Semplice cursor adapter
		SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, // Contesto
				R.layout.layout_list_spese, // il layout di ogni riga/prodotto
				c, // Il cursore
				new String[] { SpeseDb.SpeseMetaData.SPESE_LUOGO_KEY, SpeseDb.SpeseMetaData.SPESE_CATEGORIA_KEY, SpeseDb.SpeseMetaData.SPESE_COSTO_KEY,SpeseDb.SpeseMetaData.SPESE_PERSONE_KEY,SpeseDb.SpeseMetaData.SPESE_VALUTA_KEY},// questi
																// colonne
				new int[] { R.id.SpeseHeader, R.id.SpeseFooter,R.id.SpeseFooter_4,R.id.SpeseFooter_5,R.id.SpeseFooter_2});// in queste
																	// views

		tot_spese();
		
		stopManagingCursor(c);
		// Ora la list view si prende questo adapter appena creato sopra
		SpeseLv.setAdapter(adapter);
		
		button_nuova_spesa.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {

				db.close();
				mdb.close();
				
				Intent int_new = new Intent(Lista_Spese.this, Take_Photo.class);															
				int_new.putExtra("riga missione", missione);
				System.out.println("id passato a nuova spesa= " + missione);
				startActivity(int_new);
			}
		});

	}

	/**
	 * Questo metodo serve per creare il menu contestuale che si avvierà dopo un
	 * long touch su di un elemento della list view
	 * 
	 * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu,
	 *      android.view.View, android.view.ContextMenu.ContextMenuInfo)
	 */
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {

		super.onCreateContextMenu(menu, v, menuInfo);

		menu.setHeaderTitle("Options"); // Titolo del menu contestuale
		menu.add(0, v.getId(), 0, "Edit"); // Aggiungo le varie opzioni che
											// potranno comparire nel menu
		menu.add(0, v.getId(), 0, "Delete");

	}

	/**
	 * Questo metodo serve per capire cosa fare quando viene premuta un'opzione
	 * del menu contestuale
	 * 
	 * @see android.app.Activity#onContextItemSelected(android.view.MenuItem)
	 */
	@Override
	public boolean onContextItemSelected(MenuItem item) {

		// Prendo le info della riga appena cliccata con il long touch
		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
				.getMenuInfo();

		// Associo ad un long l'id della riga su cui è stato fatto il long touch
		final long examId = info.id;

		// Converto il long in una stringa per poi poterla usare
		String confr = Long.toString(examId);

		// Ciclo di if per vedere cosa ho premuto nel menu contestuale
		if (item.getTitle() == "Edit") {
			
			Intent intent_1 = new Intent(Lista_Spese.this, Nuova_Spesa.class);

			System.out.println("Confr= " + confr);

			String[] array = { missione, db.getRecord(confr, 8), confr ,"0"};
			intent_1.putExtra("array", array);
			
			db.close();
			mdb.close();
			
			startActivity(intent_1);
		}

		else if (item.getTitle() == "Delete") {
			delete_row(confr);
		}

		else {
			return false;
		} // Ritorna falso se l'utente preme da altre parti

		return true;
	}

	/**
	 * Dopo il click lungo, se viene scelto il delete con questo metodo di
	 * mostra un alert con il quale si richiede la conferma. Si passa la stringa
	 * "confr", ovvero il numero id della riga appena cliccata nella list view
	 * 
	 * @param confr
	 */
	public void delete_row(final String confr) {

		// Creo l'alert Dialog
		AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);

		// Setto il titolo del mio alert
		miaAlert.setTitle("Delete");

		// Setto il messaggio che dovrà comparire sotto l'alert
		miaAlert.setMessage("Are you shure to delete this row. Continue?");

		//
		miaAlert.setCancelable(false);

		// Setto l'azione da intraprendere quando viene dato l'ok dall'utente
		miaAlert.setPositiveButton("Yes",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int id) {

						SpeseDb sdb = new SpeseDb(getApplicationContext());

						sdb.open();

						sdb.delete_row(confr);

						c.requery();
						sdb.close();
						
						tot_spese();

					}
				});

		// Setto l'azione da intraprendere quando viene dato il "no" dall'utente
		miaAlert.setNegativeButton("Cancel",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int id) {
						return;
					}
				});

		// Ora istanzio il mio alert
		AlertDialog alert = miaAlert.create();

		// Ora visualizzo il mio alert appena istanziato
		alert.show();

	}

	/**
	 * Con questo metodo impongo al device che al tasto "back" si venga mandati
	 * alla classe Lista_Missioni
	 */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if ((keyCode == KeyEvent.KEYCODE_BACK)) {

			db.close();
			mdb.close();
			
			Intent return_list_miss = new Intent(Lista_Spese.this,
					Lista_Missioni.class);
			startActivity(return_list_miss);
			return false;
		}
		return super.onKeyDown(keyCode, event);
	}

	/**
	 * 
	 */
	public void tot_spese() {

		ValuteDb vdb = new ValuteDb(getApplicationContext());
		vdb.open();
		
		ArrayList<Float> arrayPrice = null;
		ArrayList<Integer> arrayPerson = null;
		ArrayList<String> arrayValuta = null;
		float somma=0;

		arrayPrice = new ArrayList<Float>();
		c.moveToFirst();
		while(!c.isAfterLast()) {
		     arrayPrice.add(c.getFloat(7));
		     c.moveToNext();
		}

		arrayPerson = new ArrayList<Integer>();
		c.moveToFirst();
		while(!c.isAfterLast()) {
		     arrayPerson.add(c.getInt(6));
		     c.moveToNext();
		}
		
		arrayValuta = new ArrayList<String>();
		c.moveToFirst();
		while(!c.isAfterLast()) {
		     arrayValuta.add(c.getString(5));
		     c.moveToNext();
		}

		System.out.println("Lunghezza ArrayPrice= " + arrayPrice.size());
		System.out.println("Lunghezza ArrayPerson= " + arrayPerson.size());
		System.out.println("Lunghezza ArrayPerson= " + arrayValuta.size());
		
		/*Converto il listArray in un Float[]*/
		Object[] temp = arrayPrice.toArray();
		
		float[] prezzi = new float[arrayPrice.size()];

		for (int i = 0; i < temp.length; i++) {
		    prezzi[i] = (Float) temp[i];
		  }
		
		/*Converto il listArray in un Integer[]*/
		Object[] temp_2 = arrayPerson.toArray();
		
		float[] persone = new float[arrayPerson.size()];

		for (int j = 0; j < temp_2.length; j++) {
		    persone[j] = (Integer) temp_2[j];
		  }
		
		/*Converto il listArray in un String[]*/
		Object[] temp_3 = arrayValuta.toArray();
		
		String[] valute = new String[arrayValuta.size()];

		for (int l = 0; l < temp_3.length; l++) {
		    valute[l] = (String) temp_3[l];
		  }
		
		System.out.println("Lunghezza prezzi= " + prezzi.length);
		System.out.println("Lunghezza persone= " + persone.length);
		System.out.println("Lunghezza valute= " + valute.length);
		
		for(int k=0; k<prezzi.length; k++){
			
			System.out.println("getCambio["+k+"]= "+vdb.getCambio(valute[k]));
			
			float cambio = vdb.getCambio(valute[k]);
			
			System.out.println("Prezzi["+k+"]= "+prezzi[k]);
			System.out.println("Persone["+k+"]= "+persone[k]);
			System.out.println("Valute["+k+"]= "+valute[k]);
			System.out.println("Cambio["+k+"]= "+cambio);
			
			somma = somma + ((prezzi[k]/persone[k])/cambio);
			//somma = somma + (prezzi[k]/persone[k]);
			
		}

		System.out.println("Somma= "+somma);
		
		TextView tV_tot = (TextView) findViewById(R.id.tV_TOT);
		
		String somma_s = "TOT= "+somma+" Euro";
		tV_tot.setText(somma_s);
		
		vdb.close();
		
		return;
	}

}